import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import Vue from 'vue'
import addNsname from '../add-nsname'
import store from '@/store'
import { resetRouter } from '@/router'
const name = 'user' // 模块名
const nsname = name + '/' // 命名空间模块名
const state = {
  token: getToken(),
  userInfo: {} // 这里定义一个空对象 因为在getters中引用userinfo的变量，如果设置为null，则会引起异常和报错
}
const mutations = {
  updateToken(state, newToken) {
    state.token = newToken // 将数据设置给token
    // 同步给缓存
    setToken(newToken)
    setTimeStamp(Date.now())
  }, removeToken(state) {
    state.token = null // 将数据设置给token
    // 同步给缓存
    removeToken()
  },
  setUserInfo(state, res) {
    state.userInfo = { ...res } // 修改对象地址，属于响应式
  },
  reomveUserInfo(state) {
    state.userInfo = {}
  }
}
addNsname(nsname, mutations)

// actions里的context是当前模块的store，所以不能用nsname，引入根模块store
const actions = {
  async asyncUpdateToken(context, data) {
    const res = await Vue.prototype.apis.user.login(data)// 拿到token
    // 将token存入user的state
    store.commit(mutations.updateToken.nsname, res)//
  },
  async asyncSetUserInfo() {
    const res1 = await Vue.prototype.apis.user.getUserInfo()
    const res2 = await Vue.prototype.apis.user.getUserDetailById(res1.userId)
    store.commit(mutations.setUserInfo.nsname, { ...res1, ...res2 })
    return res1 // 这里为什么要return呢 这里是给我们后期做权限的时候留下的伏笔
  },
  logout() {
    store.commit(mutations.removeToken.nsname)
    store.commit(mutations.reomveUserInfo.nsname)
    resetRouter()
  }
}
addNsname(nsname, actions)

export default {
  name,
  namespaced: true,
  state,
  mutations,
  actions
}
